package com.megaspacevr.service;

import com.megaspacevr.entity.Bookings;
import com.megaspacevr.entity.vo.BookingExportVO;
import com.megaspacevr.entity.vo.PageVO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * <p>
 * 预约表-预约记录 服务类
 * </p>
 *
 * @author yezi
 * @since 2025-06-17
 */
public interface BookingsService extends IService<Bookings> {

    /**
     * 创建预约（带业务逻辑验证）
     * @param bookings 预约信息
     * @return 是否创建成功
     */
    boolean createBooking(Bookings bookings);

    /**
     * 检查用户是否已经预约过
     * @param userToken 用户标识
     * @param contactPhone 联系电话
     * @return 是否已预约
     */
    boolean hasUserBooked(String userToken, String contactPhone);

    /**
     * 生成预约编号
     * @return 预约编号
     */
    String generateBookingNumber();

    /**
     * 获取用户的预约记录列表
     * @param userToken 用户标识
     * @return 预约记录列表
     */
    List<Bookings> getUserBookings(String userToken);

    /**
     * 取消预约
     * @param bookingId 预约ID
     * @param userToken 用户标识
     * @return 是否取消成功
     */
    boolean cancelBooking(Long bookingId, String userToken);

    /**
     * 管理员查询预约列表（分页，包含完整个人信息）
     * @param pageNum 页码
     * @param pageSize 页大小
     * @param searchText 搜索文本
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param status 预约状态
     * @param periodName 时间段
     * @param sortType 排序类型
     * @return 包含完整个人信息的分页结果
     */
    PageVO<BookingExportVO> getBookingsForAdminWithFullInfo(Integer pageNum, Integer pageSize, String searchText, 
                                                           String startDate, String endDate, String status, 
                                                           String periodName, String sortType);

    /**
     * 管理员导出预约列表（包含完整个人信息）
     * @param searchText 搜索文本
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param status 预约状态
     * @param periodName 时间段
     * @param sortType 排序类型
     * @return 包含完整个人信息的预约导出数据
     */
    List<BookingExportVO> getBookingsForExport(String searchText, String startDate, String endDate, 
                                              String status, String periodName, String sortType);
}
